<?php

/**
 * 字符截取
 * @param string $sourcestr 是截取的字符串
 * @param string $sourcestr 字符串的字节数
 * @return string 截取后的字符串
 */

function cut_str($sourcestr,$cutlength)  
{  
   $returnstr='';  
   $i=0;  
   $n=0;  
   $str_length=strlen($sourcestr);//字符串的字节数  
   while (($n<$cutlength) and ($i<=$str_length))  
   {  
      $temp_str=substr($sourcestr,$i,1);  
      $ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码  
      if ($ascnum>=224)    //如果ASCII位高与224，  
      {  
$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范，将3个连续的字符计为单个字符          
         $i=$i+3;            //实际Byte计为3  
         $n++;            //字串长度计1  
      }  
      elseif ($ascnum>=192) //如果ASCII位高与192，  
      {  
         $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范，将2个连续的字符计为单个字符  
         $i=$i+2;            //实际Byte计为2  
         $n++;            //字串长度计1  
      }  
      elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母，  
      {  
         $returnstr=$returnstr.substr($sourcestr,$i,1);  
         $i=$i+1;            //实际的Byte数仍计1个  
         $n++;            //但考虑整体美观，大写字母计成一个高位字符  
      }  
      else                //其他情况下，包括小写字母和半角标点符号，  
      {  
         $returnstr=$returnstr.substr($sourcestr,$i,1);  
         $i=$i+1;            //实际的Byte数计1个  
         $n=$n+0.5;        //小写字母和半角标点等与半个高位字符宽...  
      }  
   }  
         if ($str_length>$i){  
          $returnstr = $returnstr . "...";//超过长度时在尾处加上省略号  
      }  
    return $returnstr;  
} 


/**
 * 给低版本的php加入array_column函数
 */
if (!function_exists('array_column')) {
  function array_column($input, $columnKey, $indexKey = null) {
    $columnKeyIsNumber = (is_numeric($columnKey)) ? true : false;
    $indexKeyIsNull = (is_null($indexKey)) ? true : false;
    $indexKeyIsNumber = (is_numeric($indexKey)) ? true : false;
    $result = array();
    foreach ((array)$input as $key => $row) {
      if ($columnKeyIsNumber) {
        $tmp = array_slice($row, $columnKey, 1);
        $tmp = (is_array($tmp) && !empty($tmp)) ? current($tmp) : null;
      } else {
        $tmp = isset($row[$columnKey]) ? $row[$columnKey] : null;
      }
      if (!$indexKeyIsNull) {
        if ($indexKeyIsNumber) {
          $key = array_slice($row, $indexKey, 1);
          $key = (is_array($key) && !empty($key)) ? current($key) : null;
          $key = is_null($key) ? 0 : $key;
        } else {
          $key = isset($row[$indexKey]) ? $row[$indexKey] : 0;
        }
      }
      $result[$key] = $tmp;
    }
    return $result;
  }
}

/**
 * 生成加密后的密码
 * @param string $password 原始密码
 * @return string 加密后的密码
 */
function CreatePassword($password) {

  $temp = md5($password.'a37b621cb27c2557ee52a681');
  $temp = md5($temp.'a37b621cb27c2557ee52a681');
  return md5($temp.'bc860d113ea4310a9b268e3');
}

/**
 * 随机生成8位字符(英文字母和数字混合)密码
 */
function GeneratePassword($len = 8) {
  $c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  srand((double)microtime() * 1000000);
  for ($i = 0; $i < $len; $i++) {
    $rand.= $c[rand() % strlen($c) ];
  }
  return $rand;
}

/**
 * 检查密码是否一致
 * @param string $password 明文密码
 * @param string $md5      数据库中加密的密码
 * @return boolean 返回结果表示密码是否一致
 */
function CheckPassword($password, $md5) {
  if (CreatePassword($password) == $md5) {
    return true;
  } else {
    return false;
  }
}

/**
 * 检查权限
 * @param array or string $params 需要的权限列表
 * @return boolean 返回权限是否验证通过
 */
function CheckPermission($params) {
  $user_permissions = json_decode(session('dqoms_user_permissions'));
  if (!is_array($user_permissions)) {
    return false;
  }
  if (is_array($params)) {
    foreach ($params as $p) {
      if (!in_array($p, $user_permissions)) {
        return false;
      }
    }
  } else {
    if (!in_array($params, $user_permissions)) {
      return false;
    }
  }
  return true;
}

/**
 * 需要权限，跟CheckPermission不同的地方在于会直接返回权限不足的提示
 * @param array or string $params 需要的权限列表
 */
function RequirePermission($params) {
  if (!CheckPermission($params)) {
    exit('权限不足');
  }
}

/**
 * 检查是否登陆
 * @return boolean 是否在登陆状态
 */
function CheckLogin() {
$userid = I('session.user');
  if (!empty($userid)) {
    return true;
  } else {
    return false;
  }
}

/**
 * 合数据库返回结果列的函数
 * @param array $array1 结果1(二维数组)(array(array("col1"=>1),array("col1"=>2))
 * @param array $array2 结果2
 * @param string $column 相同值数据列的列名
 * @param string $push 空为单行合并，非空则是一个数组。
 */
function MergeColumn($array1, $array2, $column, $push = '') {
  $result = array();
  foreach ($array1 as $item) {
    
    // 如果被合并的数组中不存在需要对比的列则直接返回array1
    if (!isset($item[$column])) {
      return $array1;
    }
    if (!empty($push)) {
      $item[$push] = array();
    }
    foreach ($array2 as $item2) {
      if (!isset($item2[$column])) {
        return $array1;
      }
      
      // 合并列
      if ($item[$column] == $item2[$column]) {
        if (empty($push)) {
          $item = array_merge($item, $item2);
        } else {
          array_push($item[$push], $item2);
        }
      }
    }
    array_push($result, $item);
  }
  return $result;
}

/**
 * 格式化postgresql数据库里面返回的时间
 * @param string $datetime 原始时间格式
 * @param string $format   格式化代码，留空则按 Y-m-d H:i:s 格式化
 */
function DateTimeFormat($datetime, $format = '') {
  if (empty($datetime)) {
    return null;
  }
  $d = date_create($datetime);
  if (empty($format)) {
    $format = 'Y-m-d H:i:s';
  }
  return $d->format($format);
}
